/**
 * Project:   warnme-server
 * File:      RandomUtils.java
 * License: 
 *            This file is licensed under GNU General Public License version 3
 *            http://www.gnu.org/licenses/gpl-3.0.txt
 *
 * Copyright: Bartosz Cichecki [ cichecki.bartosz@gmail.com ]
 * Date:      Apr 24, 2014
 */

package dtu.ds.warnme.utils;

import java.text.DecimalFormat;
import java.util.Random;

import org.apache.commons.codec.binary.Base64;

import dtu.ds.warnme.model.impl.EventEntity;
import dtu.ds.warnme.model.impl.EventType;
import dtu.ds.warnme.model.impl.UserEntity;

/**
 * @author Bartosz Cichecki
 */
public class RandomUtils {

	public static boolean compareDouble(double a, double b, int precision) {
		return Math.abs(a - b) <= Math.pow(10, -precision);
	}

	public static boolean compareFloat(float a, float b, int precision) {
		return Math.abs(a - b) <= Math.pow(10, -precision);
	}

	public static String getBasicAuth(String username, String password) {
		return "Basic " + new String(Base64.encodeBase64((username + ":" + password).getBytes()));
	}

	public static float randomBearing() {
		float[] values = new float[] { 0f, 90f, 180f, 270f };
		int idx = new Random().nextInt(values.length);
		return values[idx];
	}

	public static EventEntity randomEvent() throws Exception {
		EventEntity event = new EventEntity();
		event.setBearing(randomBearing());
		event.setEventType(randomEventType());
		event.setLatitude(randomFloat(-90, 90));
		event.setLongitude(randomFloat(-180, 180));
		event.setNote(randomString(0, 25));
		event.setReportsCount(randomInt(0, 100));
		return event;
	}

	public static EventType randomEventType() {
		int pick = new Random().nextInt(EventType.values().length);
		return EventType.values()[pick];
	}

	public static float randomFloat(float min, float max) {
		Float f = (float) (min + Math.random() * (max - min + 1));
		return Float.valueOf(new DecimalFormat("#.##").format(f));
	}

	public static int randomInt(int min, int max) {
		return (int) (min + Math.random() * (max - min + 1));
	}

	public static String randomString(int minChars, int maxChars) {
		char[] chars = "abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(),./;'[]\\<>?:\"{}|-=_+".toCharArray();
		StringBuilder sb = new StringBuilder();
		Random random = new Random();
		for (int i = 0; i < randomInt(minChars, maxChars); i++) {
			char c = chars[random.nextInt(chars.length)];
			sb.append(c);
		}
		String output = sb.toString();
		return output;
	}

	public static UserEntity randomUser() throws Exception {
		UserEntity user = new UserEntity();
		user.setUsername("user" + System.nanoTime());
		user.setPassword(SecurityUtils.hashSHA512Base64("pass" + System.nanoTime()));
		user.setEmail("email" + System.nanoTime() + "@email.com");
		return user;
	}
}
